#include <stdio.h>
#include <unistd.h>//execl
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

extern char** environ;

int main()
{
    char* env_val = "MYVAL22=222222222222222222222222";
    putenv(env_val);//给自己添加环境变量(新增，不会覆盖之前的环境变量)，这个环境变量在该进程的地址空间上，不在bash中

    //char* const myenv[] = {
    //    "MYENV1 = 1111111111111",
    //    "MYENV2 = 2222222222222",
    //    "MYENV3 = 3333333333333",
    //    "MYENV4 = 4444444444444",
    //    NULL
    //};

    pid_t id = fork();
    if(id == 0)
    {
       printf("pid: %d,开始执行系统指令\n",getpid());
       sleep(1);

       execle("./mytest","mytest","-a","-b",NULL,environ);//传递系统默认的环境变量（直接得到父进程的环境变量或者通过putenv新增）
       //execle("./mytest","mytest","-a","-b",NULL,myenv);//传递自定义的环境变量，注意是会覆盖之前的环境变量

       printf("pid: %d,结束执行系统指令\n",getpid());//执行exec* 这样的函数成功了，就是程序替换成功了，后续的代码就被替换了
       //也就是说该进程后续的代码和数据都被覆盖掉了，所以也不会被执行。反之，程序替换失败了，就会产生返回值（成功无返回值）

       exit(1);
    }
    else//通过获取进程id证明了程序替换之后确实还是那个进程
    {
       pid_t rid = waitpid(-1,NULL,0);//以阻塞的方式等待任意一个子进程
       if(rid > 0)
       {
          printf("等待成功，rid: %d\n",rid);
       }
    }

    return 0;

}
